//
// @Auther: by wujehy 
// @Email:wujehy@qq.com
// @Data:20-3-14
// @Time:下午5:33
//

#ifndef LISTERNERTEST_LISTERNALCONTROL_H
#define LISTERNERTEST_LISTERNALCONTROL_H

#include <iostream>
/**
 * @brief 监听器控制器用于 触发先前 定义好额事件
 */

// 设置好 需要触发的监听器类型
enum Listerner_Type{
    Listerner_Type_A=0x0001,
    Listerner_Type_B=0x0002,
    Listerner_Type_C=0x0004,
    Listerner_Type_D=0x0008,
    Listerner_Type_ALL=0x000f,

};


typedef void (*Listerner_callbackA)(int data);
typedef void (*Listerner_callbackB)(std::string data);
typedef void (*Listerner_callbackC)(int errCode,std::string errmsg);
typedef void (*Listerner_callbackD)(void * userData);

class ListernalControl {
public:
    /**
     * @brief 构造器
     * @param name  监听器名称 ,可空 默认名称 testListernalControl
     */
    explicit ListernalControl(std::string name="testListernalControl");
    virtual ~ListernalControl();

    /**
     * @brief 传递 用户信息
     * @param data 暂存指针 谁用谁释放
     */
    void setUserData(void* data);

    /**
     * @brief 触发事件的枚举
     * @param events 事件表
     * @param userdata 触发事件 D 的穿透的数据
     */
    void callEvent(int events, void* userdata= nullptr);

    /**
     * @brief 触发 A 事件 同时传递数据给A
     * @param data 需要直接传递的数据
     */
    void callEventA(int data);

    /**
     * @brief 设置 监听器 b 监听器 是内部的 不用设
     * @param cb 回调函数
     */
    void setListernerA(Listerner_callbackA cb);
    void setListernerC(Listerner_callbackC cb);
    void setListernerD(Listerner_callbackD cb);
private:

    std::string listerName; // 监听器 的名称
    /**
     * @brief 成员有回调是 独立对象 多进程 安全
     */
    Listerner_callbackB cb_B= nullptr;
    Listerner_callbackD cb_D= nullptr;

};


#endif //LISTERNERTEST_LISTERNALCONTROL_H
